home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-9.10-netbook-remix-PL.iso / casper / filesystem.squashfs / usr / share / software-center / softwarecenter / app.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-10-28  |  18KB  |  465 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. import apt
  5. import aptdaemon
  6. import locale
  7. import dbus
  8. import dbus.service as dbus
  9. import gettext
  10. import locale
  11. import logging
  12. import glib
  13. import gtk
  14. import os
  15. import subprocess
  16. import sys
  17. import xapian
  18. from SimpleGtkbuilderApp import SimpleGtkbuilderApp
  19. from softwarecenter.enums import *
  20. from softwarecenter.version import *
  21. from softwarecenter.db.database import StoreDatabase
  22. import view.dialogs as view
  23. from view.viewswitcher import ViewSwitcher, ViewSwitcherList
  24. from view.pendingview import PendingView
  25. from view.installedpane import InstalledPane
  26. from view.availablepane import AvailablePane
  27. from view.softwarepane import SoftwarePane
  28. from apt.aptcache import AptCache
  29. from gettext import gettext as _
  30.  
  31. class SoftwarecenterDbusController(dbus.service.Object):
  32.     ''' 
  33.     This is a helper to provide the SoftwarecenterIFace
  34.     
  35.     It provides 
  36.     '''
  37.     
  38.     def __init__(self, parent, bus_name, object_path = '/com/ubuntu/Softwarecenter'):
  39.         dbus.service.Object.__init__(self, bus_name, object_path)
  40.         self.parent = parent
  41.  
  42.     
  43.     def bringToFront(self):
  44.         self.parent.window_main.present()
  45.         return True
  46.  
  47.     bringToFront = dbus.service.method('com.ubuntu.SoftwarecenterIFace')(bringToFront)
  48.  
  49.  
  50. class SoftwareCenterApp(SimpleGtkbuilderApp):
  51.     (NOTEBOOK_PAGE_AVAILABLE, NOTEBOOK_PAGE_INSTALLED, NOTEBOOK_PAGE_PENDING) = range(3)
  52.     WEBLINK_URL = 'http://apt.ubuntu.com/p/%s'
  53.     
  54.     def __init__(self, datadir, xapian_base_path):
  55.         SimpleGtkbuilderApp.__init__(self, datadir + '/ui/SoftwareCenter.ui', 'software-center')
  56.         gettext.bindtextdomain('software-center', '/usr/share/locale')
  57.         gettext.textdomain('software-center')
  58.         
  59.         try:
  60.             locale.setlocale(locale.LC_ALL, '')
  61.         except:
  62.             logging.exception('setlocale failed')
  63.  
  64.         self.setup_dbus_or_bring_other_instance_to_front()
  65.         self.setup_database_rebuilding_listener()
  66.         
  67.         try:
  68.             locale.setlocale(locale.LC_ALL, '')
  69.         except Exception:
  70.             e = None
  71.             logging.exception('setlocale failed')
  72.  
  73.         pathname = os.path.join(xapian_base_path, 'xapian')
  74.         
  75.         try:
  76.             self.db = StoreDatabase(pathname)
  77.             self.db.open()
  78.         except xapian.DatabaseOpeningError:
  79.             if os.path.isdir(pathname) and not os.listdir(pathname):
  80.                 rebuild_database = rebuild_database
  81.                 import softwarecenter.db.update
  82.                 logging.info('building local database')
  83.                 rebuild_database(pathname)
  84.                 self.db = StoreDatabase(pathname)
  85.                 self.db.open()
  86.             
  87.         except xapian.DatabaseCorruptError:
  88.             e = None
  89.             logging.exception('xapian open failed')
  90.             view.dialogs.error(None, _('Sorry, can not open the software database'), _("Please re-install the 'software-center' package."))
  91.             sys.exit(1)
  92.  
  93.         self.icons = gtk.icon_theme_get_default()
  94.         self.icons.append_search_path(ICON_PATH)
  95.         self.icons.append_search_path(SOFTWARE_CENTER_ICON_PATH)
  96.         self.icons.append_search_path(datadir + '/icons/32x32/status')
  97.         self.cache = AptCache()
  98.         self._pending_transactions = 0
  99.         self._block_menuitem_view = False
  100.         self._available_items_for_page = { }
  101.         self._selected_pkgname_for_page = { }
  102.         self._selected_appname_for_page = { }
  103.         self.available_pane = AvailablePane(self.cache, self.db, self.icons, datadir)
  104.         self.available_pane.app_details.connect('selected', self.on_app_details_changed, self.NOTEBOOK_PAGE_AVAILABLE)
  105.         self.available_pane.app_view.connect('application-selected', self.on_app_selected, self.NOTEBOOK_PAGE_AVAILABLE)
  106.         self.available_pane.connect('app-list-changed', self.on_app_list_changed, self.NOTEBOOK_PAGE_AVAILABLE)
  107.         self.alignment_available.add(self.available_pane)
  108.         self.installed_pane = InstalledPane(self.cache, self.db, self.icons, datadir)
  109.         self.installed_pane.app_details.connect('selected', self.on_app_details_changed, self.NOTEBOOK_PAGE_INSTALLED)
  110.         self.installed_pane.app_view.connect('application-selected', self.on_app_selected, self.NOTEBOOK_PAGE_INSTALLED)
  111.         self.installed_pane.connect('app-list-changed', self.on_app_list_changed, self.NOTEBOOK_PAGE_INSTALLED)
  112.         self.alignment_installed.add(self.installed_pane)
  113.         self.pending_view = PendingView(self.icons)
  114.         self.scrolledwindow_transactions.add(self.pending_view)
  115.         self.view_switcher = ViewSwitcher(datadir, self.icons)
  116.         self.scrolledwindow_viewswitcher.add(self.view_switcher)
  117.         self.view_switcher.show()
  118.         self.view_switcher.connect('view-changed', self.on_view_switcher_changed)
  119.         self.view_switcher.model.connect('transactions-changed', self.on_view_switcher_transactions_changed)
  120.         self.view_switcher.set_view(ViewSwitcherList.ACTION_ITEM_AVAILABLE)
  121.         
  122.         try:
  123.             import LaunchpadIntegration as LaunchpadIntegration
  124.             LaunchpadIntegration.set_sourcepackagename('software-center')
  125.             LaunchpadIntegration.add_items(self.menu_help, 1, True, False)
  126.         except Exception:
  127.             e = None
  128.             logging.debug("launchpad integration error: '%s'" % e)
  129.  
  130.         self.available_pane.searchentry.grab_focus()
  131.  
  132.     
  133.     def on_app_details_changed(self, widget, appname, pkgname, page):
  134.         self._selected_pkgname_for_page[page] = pkgname
  135.         self._selected_appname_for_page[page] = appname
  136.         self.update_app_status_menu()
  137.         self.update_status_bar()
  138.  
  139.     
  140.     def on_app_list_changed(self, pane, new_len, page):
  141.         self._available_items_for_page[page] = new_len
  142.         if self.notebook_view.get_current_page() == page:
  143.             self.update_status_bar()
  144.         
  145.  
  146.     
  147.     def on_app_selected(self, widget, appname, pkgname, page):
  148.         self._selected_appname_for_page[page] = appname
  149.         self._selected_pkgname_for_page[page] = pkgname
  150.         self.menuitem_copy.set_sensitive(True)
  151.         self.menuitem_copy_web_link.set_sensitive(True)
  152.  
  153.     
  154.     def on_window_main_delete_event(self, widget, event):
  155.         gtk.main_quit()
  156.  
  157.     
  158.     def on_view_switcher_transactions_changed(self, view_switcher, pending_nr):
  159.         if pending_nr == 0 and self._view_before_pending_switch is not None:
  160.             if self.view_switcher.get_view() is None:
  161.                 self.view_switcher.set_view(self._view_before_pending_switch)
  162.             
  163.             self._view_before_pending_switch = None
  164.         elif pending_nr > 0 and self._pending_transactions == 0:
  165.             self._view_before_pending_switch = self.view_switcher.get_view()
  166.             self.view_switcher.set_view(ViewSwitcherList.ACTION_ITEM_PENDING)
  167.         
  168.         self._pending_transactions = pending_nr
  169.  
  170.     
  171.     def on_view_switcher_changed(self, view_switcher, action):
  172.         logging.debug('view_switcher_activated: %s %s' % (view_switcher, action))
  173.         if action == self.NOTEBOOK_PAGE_AVAILABLE:
  174.             self.active_pane = self.available_pane
  175.         elif action == self.NOTEBOOK_PAGE_INSTALLED:
  176.             self.active_pane = self.installed_pane
  177.         elif action == self.NOTEBOOK_PAGE_PENDING:
  178.             self.active_pane = None
  179.         elif not False:
  180.             raise AssertionError, 'Not reached'
  181.         self.menuitem_view_supported_only.set_sensitive(self.active_pane != None)
  182.         self.menuitem_view_all.set_sensitive(self.active_pane != None)
  183.         if self.active_pane:
  184.             self._block_menuitem_view = True
  185.             if self.active_pane.apps_filter.get_supported_only():
  186.                 self.menuitem_view_supported_only.activate()
  187.             else:
  188.                 self.menuitem_view_all.activate()
  189.             self._block_menuitem_view = False
  190.         
  191.         self.notebook_view.set_current_page(action)
  192.         self.update_status_bar()
  193.         self.update_app_status_menu()
  194.  
  195.     
  196.     def on_menuitem_install_activate(self, menuitem):
  197.         self.active_pane.app_details.install()
  198.  
  199.     
  200.     def on_menuitem_remove_activate(self, menuitem):
  201.         self.active_pane.app_details.remove()
  202.  
  203.     
  204.     def on_menuitem_close_activate(self, widget):
  205.         gtk.main_quit()
  206.  
  207.     
  208.     def on_menu_edit_activate(self, menuitem):
  209.         '''
  210.         Check whether the search field is focused and if so, focus some items
  211.         '''
  212.         if self.active_pane:
  213.             state = self.active_pane.searchentry.is_focus()
  214.         else:
  215.             state = False
  216.         edit_menu_items = [
  217.             self.menuitem_undo,
  218.             self.menuitem_redo,
  219.             self.menuitem_cut,
  220.             self.menuitem_copy,
  221.             self.menuitem_paste,
  222.             self.menuitem_delete,
  223.             self.menuitem_select_all]
  224.         for item in edit_menu_items:
  225.             item.set_sensitive(state)
  226.         
  227.  
  228.     
  229.     def on_menuitem_undo_activate(self, menuitem):
  230.         self.active_pane.searchentry.undo()
  231.  
  232.     
  233.     def on_menuitem_redo_activate(self, menuitem):
  234.         self.active_pane.searchentry.redo()
  235.  
  236.     
  237.     def on_menuitem_cut_activate(self, menuitem):
  238.         self.active_pane.searchentry.cut_clipboard()
  239.  
  240.     
  241.     def on_menuitem_copy_activate(self, menuitem):
  242.         self.active_pane.searchentry.copy_clipboard()
  243.  
  244.     
  245.     def on_menuitem_paste_activate(self, menuitem):
  246.         self.active_pane.searchentry.paste_clipboard()
  247.  
  248.     
  249.     def on_menuitem_delete_activate(self, menuitem):
  250.         self.active_pane.searchentry.set_text('')
  251.  
  252.     
  253.     def on_menuitem_select_all_activate(self, menuitem):
  254.         self.active_pane.searchentry.select_region(0, -1)
  255.  
  256.     
  257.     def on_menuitem_copy_web_link_activate(self, menuitem):
  258.         page = self.notebook_view.get_current_page()
  259.         
  260.         try:
  261.             pkg = self._selected_pkgname_for_page[page]
  262.         except KeyError:
  263.             e = None
  264.             return None
  265.  
  266.         clipboard = gtk.Clipboard()
  267.         clipboard.set_text(self.WEBLINK_URL % pkg)
  268.  
  269.     
  270.     def on_menuitem_search_activate(self, widget):
  271.         if self.active_pane:
  272.             self.active_pane.searchentry.grab_focus()
  273.             self.active_pane.searchentry.select_region(0, -1)
  274.         
  275.  
  276.     
  277.     def on_menuitem_software_sources_activate(self, widget):
  278.         self.window_main.set_sensitive(False)
  279.         p = subprocess.Popen([
  280.             'gksu',
  281.             '--desktop',
  282.             '/usr/share/applications/software-properties.desktop',
  283.             '--',
  284.             '/usr/bin/software-properties-gtk',
  285.             '-n',
  286.             '-t',
  287.             str(self.window_main.window.xid)])
  288.         ret = None
  289.         while ret is None:
  290.             while gtk.events_pending():
  291.                 gtk.main_iteration()
  292.             ret = p.poll()
  293.         if ret == 1:
  294.             self.run_update_cache()
  295.         
  296.         self.window_main.set_sensitive(True)
  297.  
  298.     
  299.     def on_menuitem_about_activate(self, widget):
  300.         self.aboutdialog.set_version(VERSION)
  301.         self.aboutdialog.run()
  302.         self.aboutdialog.hide()
  303.  
  304.     
  305.     def on_menuitem_help_activate(self, menuitem):
  306.         p = subprocess.Popen([
  307.             'yelp',
  308.             'ghelp:software-center'])
  309.         glib.timeout_add(1000, (lambda p: p.poll() == None), p)
  310.  
  311.     
  312.     def on_menuitem_view_all_activate(self, widget):
  313.         if self._block_menuitem_view:
  314.             return None
  315.         self.active_pane.apps_filter.set_supported_only(False)
  316.         self.active_pane.refresh_apps()
  317.  
  318.     
  319.     def on_menuitem_view_supported_only_activate(self, widget):
  320.         if self._block_menuitem_view:
  321.             return None
  322.         self.active_pane.apps_filter.set_supported_only(True)
  323.         self.active_pane.refresh_apps()
  324.  
  325.     
  326.     def _on_trans_finished(self, trans, enum):
  327.         '''callback when a aptdaemon transaction finished'''
  328.         if enum == aptdaemon.enums.EXIT_FAILED:
  329.             excep = trans.get_error()
  330.             msg = '%s: %s\n%s\n\n%s' % (_('ERROR'), aptdaemon.enums.get_error_string_from_enum(excep.code), aptdaemon.enums.get_error_description_from_enum(excep.code), excep.details)
  331.             print msg
  332.         
  333.         self.cache.open()
  334.  
  335.     
  336.     def run_update_cache(self):
  337.         '''update the apt cache (e.g. after new sources where added '''
  338.         aptd_client = aptdaemon.client.AptClient()
  339.         trans = aptd_client.update_cache(exit_handler = self._on_trans_finished)
  340.         
  341.         try:
  342.             trans.run()
  343.         except dbus.exceptions.DBusException:
  344.             e = None
  345.             if e._dbus_error_name == 'org.freedesktop.PolicyKit.Error.NotAuthorized':
  346.                 pass
  347.             else:
  348.                 raise 
  349.             e._dbus_error_name == 'org.freedesktop.PolicyKit.Error.NotAuthorized'
  350.  
  351.  
  352.     
  353.     def update_app_status_menu(self):
  354.         """Helper that updates the 'File' and 'Edit' menu to enable/disable
  355.            install/remove and Copy/Copy weblink
  356.         """
  357.         logging.debug('update_app_status_menu')
  358.         page = self.notebook_view.get_current_page()
  359.         
  360.         try:
  361.             pkgname = self._selected_pkgname_for_page[page]
  362.         except KeyError:
  363.             e = None
  364.             self.menuitem_install.set_sensitive(False)
  365.             self.menuitem_remove.set_sensitive(False)
  366.             self.menuitem_copy_web_link.set_sensitive(False)
  367.             return False
  368.  
  369.         if not self.cache.ready:
  370.             glib.timeout_add((100,), (lambda : self.update_app_status_menu()))
  371.             return False
  372.         if not self.cache.has_key(pkgname):
  373.             self.menuitem_install.set_sensitive(False)
  374.             self.menuitem_remove.set_sensitive(False)
  375.             self.menuitem_copy_web_link.set_sensitive(False)
  376.         
  377.         if self.cache.has_key(pkgname):
  378.             pkg = self.cache[pkgname]
  379.             installed = bool(pkg.installed)
  380.             self.menuitem_install.set_sensitive(not installed)
  381.             self.menuitem_remove.set_sensitive(installed)
  382.         else:
  383.             self.menuitem_install.set_sensitive(False)
  384.             self.menuitem_remove.set_sensitive(False)
  385.         return False
  386.  
  387.     
  388.     def update_status_bar(self):
  389.         '''Helper that updates the status bar'''
  390.         page = self.notebook_view.get_current_page()
  391.         if self.active_pane:
  392.             s = self.active_pane.get_status_text()
  393.         else:
  394.             s = ''
  395.         self.label_status.set_text(s)
  396.  
  397.     
  398.     def _on_database_rebuilding_handler(self, is_rebuilding):
  399.         logging.debug('_on_database_rebuilding_handler %s' % is_rebuilding)
  400.         self._database_is_rebuilding = is_rebuilding
  401.         self.window_rebuilding.set_transient_for(self.window_main)
  402.         self.window_rebuilding.set_title('')
  403.         self.window_main.set_sensitive(not is_rebuilding)
  404.         if is_rebuilding:
  405.             self.window_rebuilding.show()
  406.         else:
  407.             self.db.reopen()
  408.             self.window_rebuilding.hide()
  409.  
  410.     
  411.     def setup_database_rebuilding_listener(self):
  412.         '''
  413.         Setup system bus listener for database rebuilding
  414.         '''
  415.         self._database_is_rebuilding = False
  416.         
  417.         try:
  418.             bus = dbus.SystemBus()
  419.         except:
  420.             logging.exception('could not get system bus')
  421.             return None
  422.  
  423.         
  424.         try:
  425.             proxy_obj = bus.get_object('com.ubuntu.Softwarecenter', '/com/ubuntu/Softwarecenter')
  426.             iface = dbus.Interface(proxy_obj, 'com.ubuntu.Softwarecenter')
  427.             res = iface.IsRebuilding()
  428.             self._on_database_rebuilding_handler(res)
  429.         except Exception:
  430.             e = None
  431.             logging.debug("query for the update-database exception '%s' (probably ok)" % e)
  432.  
  433.         bus.add_signal_receiver(self._on_database_rebuilding_handler, 'DatabaseRebuilding', 'com.ubuntu.Softwarecenter')
  434.  
  435.     
  436.     def setup_dbus_or_bring_other_instance_to_front(self):
  437.         ''' 
  438.         This sets up a dbus listener
  439.         '''
  440.         
  441.         try:
  442.             bus = dbus.SessionBus()
  443.         except:
  444.             logging.exception('could not initiate dbus')
  445.             return None
  446.  
  447.         
  448.         try:
  449.             proxy_obj = bus.get_object('com.ubuntu.Softwarecenter', '/com/ubuntu/Softwarecenter')
  450.             iface = dbus.Interface(proxy_obj, 'com.ubuntu.SoftwarecenterIFace')
  451.             iface.bringToFront()
  452.             sys.exit()
  453.         except dbus.DBusException:
  454.             e = None
  455.             bus_name = dbus.service.BusName('com.ubuntu.Softwarecenter', bus)
  456.             self.dbusControler = SoftwarecenterDbusController(self, bus_name)
  457.  
  458.  
  459.     
  460.     def run(self):
  461.         self.window_main.show_all()
  462.         SimpleGtkbuilderApp.run(self)
  463.  
  464.  
  465.